package com.ruoyi.util.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * @Author syc
 * @Date Created in 10:45 2022/8/9
 * @Description 反编译
 */
public class Fby {

    public static void fbyField() {
        StringBuilder s = new StringBuilder();

        Class studentClass = null;
        try {
            studentClass = Class.forName("com.ruoyi.util.reflect.User");
            s.append(Modifier.toString(studentClass.getModifiers()) + " class " + studentClass.getSimpleName() + " {\n");// Class类的getName方法
            //获取所有的属性
            Field[] fields = studentClass.getDeclaredFields();
            for (Field f : fields){
                s.append("\t");
                // 获取属性的修饰符列表,返回的修饰符是一个数字，每个数字是修饰符的代号
                // 用Modifier类的toString转换成字符串
                s.append(Modifier.toString(f.getModifiers()));
                if (f.getModifiers() != 0) s.append(" ");
                s.append(f.getType().getSimpleName());// 获取属性的类型
                s.append(" ");
                s.append(f.getName());// 获取属性的名字
                s.append(";\n");
            }
            s.append("}");
            System.out.println(s);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     *了解一下，不需要掌握（反编译一个类的方法。）
     */
    public static void fbyMethod() {
        StringBuilder s = new StringBuilder();
        Class userClass = null;
        try {
            userClass = Class.forName("com.ruoyi.util.reflect.User");
            s.append(Modifier.toString(userClass.getModifiers()));
            s.append(" class ");
            s.append(userClass.getSimpleName());
            s.append(" {\n");
            // 获取所有的Method（包括私有的！）
            Method[] methods = userClass.getDeclaredMethods();
            for (Method m : methods){
                s.append("\t");
                // 获取修饰符列表
                s.append(Modifier.toString(m.getModifiers()));
                s.append(" ");
                // 获取方法的返回值类型
                s.append(m.getReturnType().getSimpleName());
                s.append(" ");
                // 获取方法名
                s.append(m.getName());
                s.append("(");
                // 方法的修饰符列表（一个方法的参数可能会有多个。）
                Class[] parameterTypes = m.getParameterTypes();
                for (int i = 0; i < parameterTypes.length; i++){
                    s.append(parameterTypes[i].getSimpleName());
                    if (i != parameterTypes.length - 1) s.append(", ");
                }
                s.append(") {}\n");
            }
            s.append("}");
            System.out.println(s);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Author syc
     * @Date Created in 2022-08-09 14:15:01
     * @Description 反编译一个类的构造方法Constructor
     */
    public static void fbyConstructor() {
        StringBuilder s = new StringBuilder();

        Class userClass = null;
        try {
            userClass = Class.forName("com.ruoyi.util.reflect.User");
            //public class UserService {
            s.append(Modifier.toString(userClass.getModifiers()));
            s.append(" class ");
            s.append(userClass.getSimpleName());
            s.append("{\n");

            Constructor[] constructors = userClass.getDeclaredConstructors();
            for (Constructor c : constructors){
                //public Vip(int no, String name, String birth, boolean sex) {
                s.append("\t");
                s.append(Modifier.toString(c.getModifiers()));
                s.append(" ");
  //            s.append(c.getName());//包名+类名
                s.append(userClass.getSimpleName());//类名
                s.append("(");
                Class[] parameterTypes = c.getParameterTypes();
                for (int i = 0; i < parameterTypes.length; i++){
                    s.append(parameterTypes[i].getSimpleName());
                    if (i != parameterTypes.length - 1 ) s.append(", ");
                }
                s.append("){}\n");
            }
            s.append("}");
            System.out.println(s);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

//    public static void main(String[] args) {
//        Fby.fbyConstructor();
//    }



}
